/**
 * //给定一个 N 叉树，返回其节点值的层序遍历。（即从左到右，逐层遍历）。
 * //
 * // 树的序列化输入是用层序遍历，每组子节点都由 null 值分隔（参见示例）。
 * //
 * //
 * //
 * // 示例 1：
 * //
 * //
 * //
 * //
 * //输入：root = [1,null,3,2,4,null,5,6]
 * //输出：[[1],[3,2,4],[5,6]]
 * //
 * //
 * // 示例 2：
 * //
 * //
 * //
 * //
 * //输入：root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,
 * //null,13,null,null,14]
 * //输出：[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]
 * //
 * //
 * //
 * //
 * // 提示：
 * //
 * //
 * // 树的高度不会超过 1000
 * // 树的节点总数在 [0, 10^4] 之间
 * //
 * // Related Topics 树 广度优先搜索 👍 180 👎 0
 */

package com.xixi.dataStructure.tree.binaryTree;

import java.util.ArrayList;
import java.util.List;

public class ID00429NAryTreeLevelOrderTraversal {
    public static void main(String[] args) {
        Solution solution = new ID00429NAryTreeLevelOrderTraversal().new Solution();
    }


//leetcode submit region begin(Prohibit modification and deletion)
/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

    class Solution {
        public List<List<Integer>> levelOrder(Node root) {
            List<List<Integer>> res = new ArrayList<>();
            if (root == null) return res;
            List<Node> thisLevel = new ArrayList<>();
            List<Node> nextLevel;
            thisLevel.add(root);
            while (!thisLevel.isEmpty()) { //从上到下纵向遍历
                nextLevel = new ArrayList<>();
                List<Integer> thisLevelRes = new ArrayList<>();
                for (Node thisNode : thisLevel) {
                    thisLevelRes.add(thisNode.val); //当前层的结果集
                    //添加下一层
                    if (thisNode.children != null && !thisNode.children.isEmpty()) { //如果有子节点，添加到下一层遍历中
                        nextLevel.addAll(thisNode.children);
                    }

                }
                res.add(thisLevelRes);
                thisLevel = nextLevel;
            }

            return res;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)


    class Node {
        public int val;
        public List<Node> children;

        public Node() {
        }

        public Node(int _val) {
            val = _val;
        }

        public Node(int _val, List<Node> _children) {
            val = _val;
            children = _children;
        }
    }

}